package br.edu.utfpr.app.beans;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;

import br.edu.utfpr.app.dto.PedidoDTO;
import br.edu.utfpr.app.dto.ProdutoDTO;
import br.edu.utfpr.util.IBean;

@Entity
public class Pedido implements IBean{

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pedido_seq")
	@SequenceGenerator(allocationSize = 1, name = "pedido_seq", sequenceName = "pedido_seq")
	private Long id;
	
	private String descricao;
	
	@OneToOne
	private Cliente cliente;
	
	@OneToOne
	private Vendedor vendedor;
	
	@ManyToMany(cascade = CascadeType.PERSIST)
	private List<Produto> produtos;
	
	public Pedido() {
		produtos = new ArrayList<Produto>();
	}

	@Override
	public Long getId() {
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setVendedor(Vendedor vendedor) {
		this.vendedor = vendedor;
	}

	public Vendedor getVendedor() {
		return vendedor;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public String getDescricao() {
		return descricao;
	}
	
	public void add(Produto p){
		produtos.add(p);
	}
	
	public void remove(Produto p){
		if(produtos.contains(p))
			produtos.remove(p);
	}
	
	public List<Produto> getProdutos(){
		return produtos;
	}
	
	public void setProdutos(List<Produto> produtos){
		this.produtos = produtos;
	}
	
	public Pedido(PedidoDTO dto){
		this.id = dto.getId() == null ? null : dto.getId();
		this.descricao = dto.getDescricao();
		this.cliente = new Cliente(dto.getCliente());
		this.vendedor = new Vendedor(dto.getVendedor());
		
		if(produtos == null)
			produtos = new ArrayList<Produto>();
		
		for (ProdutoDTO p : dto.getProdutos()) {
			this.add(new Produto(p));
		}
	}
	
	public PedidoDTO parseDTO(){
		PedidoDTO p = new PedidoDTO();
		p.setId(this.id);
		p.setDescricao(this.descricao);
		
		Cliente c = new Cliente();
		c.setId(this.cliente.getId() == null ? null : this.cliente.getId());
		c.setNome(this.cliente.getNome());
		c.setCpf(this.cliente.getCpf());
		
		p.setCliente(c.parseDTO());
		
		Vendedor v = new Vendedor();
		v.setId(this.vendedor.getId() == null ? null : this.vendedor.getId());
		v.setNome(this.vendedor.getNome());
		v.setCpf(this.vendedor.getCpf());
		
		p.setVendedor(v.parseDTO());
		
		List<ProdutoDTO> produtos = new ArrayList<ProdutoDTO>();
		for (Produto produto : this.produtos) {
			produtos.add(produto.parseDTO());
		}
		
		p.setProdutos(produtos);
		
		return p;
	}
	
}
